home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 001-025 / scopedisk15 / click / click.c next >
C/C++ Source or Header  |  1995-03-18  |  3KB  |  145 lines

  1. #include <exec/memory.h>
  2. #include <workbench/startup.h>
  3. #include <workbench/workbench.h>
  4. #include "launch.h"
  5.  
  6. main(ac, av)
  7. int ac;
  8. char **av;
  9. {
  10.     click(av[1]);
  11. }
  12.  
  13. UBYTE *AllocMem();
  14. struct SegList *LoadSeg();
  15. struct MsgPort *CreateProc(), *CreatePort();
  16. struct WBStartup *BuildStartup();
  17.  
  18. struct MsgPort *rport;
  19. struct WBStartup *startup;
  20.  
  21. cleanup(msg, name)
  22. char *msg;
  23. char *name;
  24. {
  25.     if(msg && name)
  26.         printf("click: %s: %s\n", name, msg);
  27.     if(startup)
  28.         FreeStartup(startup);
  29.     if(rport) DeletePort(rport);
  30. }
  31.  
  32. click(name)
  33. char *name;
  34. {
  35.     rport = NULL;
  36.  
  37.     rport = CreatePort(0, 0);
  38.     if(!rport) {
  39.         cleanup("Can't create reply port", name);
  40.         exit(20);
  41.     }
  42.  
  43.     startup = BuildStartup(name);
  44.     if(!startup) {
  45.         cleanup("Can't load", name);
  46.         exit(20);
  47.     }
  48.  
  49.     startup->sm_Message.mn_ReplyPort = rport;
  50.     startup->sm_Message.mn_Length = sizeof(struct WBStartup);
  51.     startup->sm_Message.mn_Node.ln_Type = NT_MESSAGE;
  52.  
  53.     PutMsg(startup->sm_Process, startup);
  54.     WaitPort(rport);
  55.  
  56.     cleanup(0, 0);
  57.     exit(0);
  58. }
  59.  
  60. FreeStartup(msg)
  61. struct WBStartup *msg;
  62. {
  63.     if(msg->sm_ArgList) {
  64.         int i;
  65.         for(i = 0; i < msg->sm_NumArgs; i++) {
  66.             if(msg->sm_ArgList[i].wa_Lock)
  67.                 UnLock(msg->sm_ArgList[i].wa_Lock);
  68.             if(msg->sm_ArgList[i].wa_Name)
  69.                 FreeMem(msg->sm_ArgList[i].wa_Name,
  70.                     strlen(msg->sm_ArgList[i].wa_Name)+1);
  71.         }
  72.         FreeMem(msg->sm_ArgList,
  73.             sizeof(struct WBArg) * msg->sm_NumArgs);
  74.     }
  75.     if(msg->sm_Segment)
  76.         UnLoadSeg(msg->sm_Segment);
  77.     if(msg->sm_ToolWindow)
  78.         FreeMem(msg->sm_ToolWindow,
  79.             strlen(msg->sm_ToolWindow)+1);
  80.     FreeMem(msg, sizeof(struct WBStartup));
  81. }
  82.  
  83. struct WBStartup *
  84. BuildStartup(name)
  85. char *name;
  86. {
  87.     ULONG flock;
  88.     struct WBStartup *msg;
  89.     char *s, *namep;
  90.  
  91.     msg = (struct WBStartup *)
  92.         AllocMem(sizeof(struct WBStartup), MEMF_PUBLIC|MEMF_CLEAR);
  93.     if(!msg)
  94.         return 0;
  95.  
  96.     msg->sm_Segment = LoadSeg(name);
  97.     if(!msg->sm_Segment) {
  98.         FreeStartup(msg);
  99.         return 0;
  100.     }
  101.  
  102.     msg->sm_ToolWindow = 0;
  103.  
  104.     msg->sm_ArgList = (struct WBArg *)
  105.         AllocMem(sizeof(struct WBArg), MEMF_PUBLIC | MEMF_CLEAR);
  106.     if(!msg->sm_ArgList) {
  107.         FreeStartup(msg);
  108.         return 0;
  109.     }
  110.  
  111.     msg->sm_NumArgs = 1;
  112.  
  113.     flock = Lock(name);
  114.     if(!flock) {
  115.         FreeStartup(msg);
  116.         return 0;
  117.     }
  118.     msg->sm_ArgList[0].wa_Lock = ParentDir(flock);
  119.     UnLock(flock);
  120.     if(!msg->sm_ArgList[0].wa_Lock) {
  121.         FreeStartup(msg);
  122.         return 0;
  123.     }
  124.  
  125.     namep = name;
  126.     for(s = name; *s; s++)
  127.         if(*s=='/' || *s==':')
  128.             namep = s+1;
  129.     msg->sm_ArgList[0].wa_Name = AllocMem(strlen(namep)+1, MEMF_PUBLIC);
  130.     if(!msg->sm_ArgList[0].wa_Name) {
  131.         FreeStartup(msg);
  132.         return 0;
  133.     }
  134.     strcpy(msg->sm_ArgList[0].wa_Name, namep);
  135.  
  136.     msg->sm_Process =
  137.         CreateProc(msg->sm_ArgList[0].wa_Name, 0, msg->sm_Segment, 8192);
  138.     if(!msg->sm_Process) {
  139.         FreeStartup(msg);
  140.         return 0;
  141.     }
  142.  
  143.     return msg;
  144. }
  145.